%     VIRTUAL HC - программа для получения эффективных свойств сотовых заполнителей
%     Copyright (C) 2018-2020  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function [Nodes, Elements, Next_Node_Number, Next_Element_Number] = Mesh_2D_Right_Triangle(Point_1, Point_2, Point_3, N_Elements_Edge, Next_Node_Number, Next_Element_Number, Set_ID)

N_Nodes = (N_Elements_Edge + 1) * (N_Elements_Edge + 2) / 2;
N_Elements = N_Elements_Edge * (N_Elements_Edge + 1) / 2;

Nodes = zeros(N_Nodes, 4);
Elements = zeros(N_Elements, 8);

counter = 0;

for i=1:N_Elements_Edge
    
    Temp_Point_1 = (N_Elements_Edge + 1 - i)/N_Elements_Edge * Point_1 + (i-1)/N_Elements_Edge * Point_3;
    Temp_Point_2 = (N_Elements_Edge + 1 - i)/N_Elements_Edge * Point_2 + (i-1)/N_Elements_Edge * Point_3;
    
    counter = counter + 1;
    Nodes(counter,1) = Next_Node_Number;
    Next_Node_Number = Next_Node_Number + 1;
    Nodes(counter,2:3) = Temp_Point_1;
    
    for j=2:N_Elements_Edge+1-i
        
        counter = counter + 1;
        Nodes(counter,1) = Next_Node_Number;
        Next_Node_Number = Next_Node_Number + 1;
        Nodes(counter,2:3) = (N_Elements_Edge + 2 - i - j)/(N_Elements_Edge + 1 - i) * Temp_Point_1 + (j-1)/(N_Elements_Edge + 1 - i) * Temp_Point_2;
        
    end
    
    counter = counter + 1;
    Nodes(counter,1) = Next_Node_Number;
    Next_Node_Number = Next_Node_Number + 1;
    Nodes(counter,2:3) = Temp_Point_2;
    
end

counter = counter + 1;

Nodes(counter,1) = Next_Node_Number;
Next_Node_Number = Next_Node_Number + 1;
Nodes(counter,2:3) = Point_3;

counter = 0;
counter_2 = 0;

for i=1:N_Elements_Edge-1
    
    for j=1:N_Elements_Edge-i
        
        counter = counter + 1;
        Elements(counter,1) = Next_Element_Number;
        Next_Element_Number = Next_Element_Number + 1;
        
        Elements(counter,2) = 2;
        Elements(counter,3) = 4;
        Elements(counter,4) = Set_ID;
        
        Elements(counter,5) = Nodes(counter_2 + j,1);
        Elements(counter,6) = Nodes(counter_2 + j+1,1);
        Elements(counter,7) = Nodes(counter_2 + N_Elements_Edge+2-i + j+1,1);
        Elements(counter,8) = Nodes(counter_2 + N_Elements_Edge+2-i + j,1);
        
    end
    
    counter = counter + 1;
    Elements(counter,1) = Next_Element_Number;
    Next_Element_Number = Next_Element_Number + 1;

    Elements(counter,2) = 2;
    Elements(counter,3) = 3;
    Elements(counter,4) = Set_ID;

    Elements(counter,5) = Nodes(counter_2 + N_Elements_Edge+1-i,1);
    Elements(counter,6) = Nodes(counter_2 + N_Elements_Edge+2-i,1);
    Elements(counter,7) = Nodes(counter_2 + N_Elements_Edge+2-i + N_Elements_Edge+1-i,1);
    
    counter_2 = counter_2 + N_Elements_Edge+2-i;
    
end

counter = counter + 1;
Elements(counter,1) = Next_Element_Number;
Next_Element_Number = Next_Element_Number + 1;

Elements(counter,2) = 2;
Elements(counter,3) = 3;
Elements(counter,4) = Set_ID;

Elements(counter,5) = Nodes(N_Nodes-2,1);
Elements(counter,6) = Nodes(N_Nodes-1,1);
Elements(counter,7) = Nodes(N_Nodes,1);
